/*
 * Copyright (C) 2009 2DAI
 *
 * Este programa es Software Libre; usted puede redistribuirlo
 * y/o modificarlo bajo los términos de la "GNU General Public
 * License" como lo publica la "FSF Free Software Foundation",
 * o (a su elección) de cualquier versión posterior.
 *
 * Este programa es distribuido con la esperanza de que le será
 * útil, pero SIN NINGUNA GARANTIA; incluso sin la garantía
 * implícita por el MERCADEO o EJERCICIO DE ALGUN PROPOSITO en
 * particular. Vea la "GNU General Public License" para más
 * detalles.
 *
 * Usted debe haber recibido una copia de la "GNU General Public
 * License" junto con este programa, si no, escriba a la "FSF
 * Free Software Foundation, Inc.", 59 Temple Place - Suite 330,
 * Boston, MA  02111-1307, USA.
 *
 * Forma de uso? Facil, se inicializa pasandole el archivo de aundio .wav
 * y se arranca el nuevo hilo con .start() Enjoy! ^^
 */

package util;

/**
 *
 * @author 2Dai
 * Realizado por Jorge Garrido Oval
 */

import java.io.File;
import java.io.IOException;
import javax.sound.sampled.AudioFormat;
import javax.sound.sampled.AudioInputStream;
import javax.sound.sampled.AudioSystem;
import javax.sound.sampled.DataLine;
import javax.sound.sampled.LineUnavailableException;
import javax.sound.sampled.SourceDataLine;

public class AudioPlayer extends Thread {
    private static final int	EXTERNAL_BUFFER_SIZE = 128000;
    private String archivo;
    
    public AudioPlayer() {}

    public AudioPlayer(String string) {
        this.archivo=string;
    }

    private synchronized void play(String file){
		File	soundFile = new File(file);

		AudioInputStream    audioInputStream = null;
		try{
                    audioInputStream = AudioSystem.getAudioInputStream(soundFile);
		}catch (Exception e){
                    Errors.creaError("Error: archivo no encontrado", e.getStackTrace());
		}
		AudioFormat	audioFormat = audioInputStream.getFormat();

		SourceDataLine	line = null;
		DataLine.Info	info = new DataLine.Info(SourceDataLine.class,audioFormat);
		try{
                    line = (SourceDataLine) AudioSystem.getLine(info);
                    line.open(audioFormat);
		}catch (LineUnavailableException e){
                    Errors.creaError("Error: linea de datos no disponible", e.getStackTrace());
		}catch (Exception e){
                    Errors.creaError("Error: formato de archivo de audio no valido", e.getStackTrace());
		}
		line.start();
		int	nBytesRead = 0;
		byte[]	abData = new byte[EXTERNAL_BUFFER_SIZE];
		while (nBytesRead != -1){
                    try{
                        nBytesRead = audioInputStream.read(abData, 0, abData.length);
                    }catch (IOException e){
                        Errors.creaError("Error de entrada/salida", e.getStackTrace());
                    }
                    if (nBytesRead >= 0){
                        //linea de repoducción, no tocar
                        int nBytesWritten = line.write(abData, 0, nBytesRead);
                    }
		}
		line.drain();
		line.close();
	}

    @Override
    public void run() {
        play(archivo);
    }
}
